/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import bentity.beOrdenDespacho;
import bentity.bePedido;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *
 * @author renzo
 */
public class daoOrdenDespacho {

    public int registrarOrdenDespacho(beOrdenDespacho orden) throws Exception{
        Connection conn = null;
        PreparedStatement ps = null;
        int nextId = daoHelper.getNextId("ORDEN_DESPACHO", "ID_ORDEN_DESPACHO");
        String sql = "INSERT INTO ORDEN_DESPACHO (ID_ORDEN_DESPACHO, FECHA_DESPACHO, OPERARIO, ESTADOORDEN) VALUES ( ? , ? , ? , ?)";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, nextId);
        ps.setDate(2, orden.getFechaDespacho());
        ps.setString(3, orden.getOperario());
        ps.setInt(4, this.getEstadoOrdenEnBD(orden.getEstadoOrden(), conn));
        ps.executeUpdate();
        ps.close();
        daoPedido dp = new daoPedido();
        for(int i=0;i<orden.getPedidos().size();i++){
            dp.actualizarEstadoPedido(orden.getPedidos().get(i).getIdPedido(),bePedido.P_POR_DESPACHAR,conn);
            dp.asignarOrdenDespacho(nextId,orden.getPedidos().get(i).getIdPedido(),conn);
        }
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int getEstadoOrdenEnBD(int estadoOrden, Connection conn) throws Exception{
        PreparedStatement ps = null;
        ResultSet rs = null;
        int estado = -1;
        String sql = "SELECT ID_DATO FROM DATOS_COMBO WHERE NOMBRE_COMBO = 'DESPAC' ";
        if (estadoOrden == beOrdenDespacho.O_POR_DESPACHAR)
            sql += "AND NOMBRE_DATO = 'Por despachar'";
        if (estadoOrden == beOrdenDespacho.O_DESPACHADA)
            sql += "AND NOMBRE_DATO = 'Despachado'";
        if (estadoOrden == beOrdenDespacho.O_CANCELADA)
            sql += "AND NOMBRE_DATO = 'Cancelada'";
        if (estadoOrden == beOrdenDespacho.O_RESERVADA)
            sql += "AND NOMBRE_DATO = 'Reservado'";
        boolean seAbrioConexion = false;
        if (conn == null){
            conn = daoHelper.dameConexion();
            seAbrioConexion = true;
        }
        ps = conn.prepareStatement(sql);
        rs = ps.executeQuery();
        if (rs.next())
            estado = rs.getInt(1);
        rs.close();
        ps.close();
        if (seAbrioConexion)
            conn.close();
        return estado;
    }

    public ArrayList<beOrdenDespacho> queryOrdenesByFilters(int idOrdenDespacho, String estadoOrdenDespacho, Date fechaDesde, Date fechaHasta) throws Exception{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        int []contador = new int[4];
        int estadoOrdenEnBD = -1;
        if (estadoOrdenDespacho.equals("Por despachar"))
            estadoOrdenEnBD = this.getEstadoOrdenEnBD(beOrdenDespacho.O_POR_DESPACHAR, conn);
        if (estadoOrdenDespacho.equals("Despachado"))
            estadoOrdenEnBD = this.getEstadoOrdenEnBD(beOrdenDespacho.O_DESPACHADA, conn);
        if (estadoOrdenDespacho.equals("Cancelada"))
            estadoOrdenEnBD = this.getEstadoOrdenEnBD(beOrdenDespacho.O_CANCELADA, conn);
        if (estadoOrdenDespacho.equals("Reservado"))
            estadoOrdenEnBD = this.getEstadoOrdenEnBD(beOrdenDespacho.O_RESERVADA, conn);
        String sql = "SELECT A.ID_ORDEN_DESPACHO, A.FECHA_DESPACHO, A.OPERARIO, B.NOMBRE_DATO FROM ORDEN_DESPACHO A LEFT JOIN DATOS_COMBO B ON (A.ESTADOORDEN = B.ID_DATO) WHERE 1=1 ";
        if (idOrdenDespacho >= 0){
            sql += " AND ID_ORDEN_DESPACHO = ? ";
            contador[0] = 1;
        }
        if (estadoOrdenDespacho.length() != 0){
            sql += " AND ESTADOORDEN = ? ";
            contador[1] = 1;
        }
        if (fechaDesde != null){
            sql += " AND FECHA_DESPACHO >= ? ";
            contador[2] = 1;
        }
        if (fechaHasta != null){
            sql += " AND FECHA_DESPACHO <= ? ";
            contador[3] = 1;
        }
        sql += " ORDER BY FECHA_DESPACHO ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        int j=0;
        for(int i=0; i<4; i++){
            if (contador[i]==1){
                j++;
                switch (i){
                    case 0:
                        ps.setInt(j,idOrdenDespacho);
                        break;
                    case 1:
                        ps.setInt(j,estadoOrdenEnBD);
                        break;
                    case 2:
                        ps.setDate(j,fechaDesde);
                        break;
                    case 3:
                        ps.setDate(j,fechaHasta);
                        break;
                }
            }
        }
        rs = ps.executeQuery();
        ArrayList<beOrdenDespacho> ordenes = new ArrayList<beOrdenDespacho>();
        beOrdenDespacho o = null;
        while(rs.next()){
            o = new beOrdenDespacho();
            o.setIdOrdenDespacho(rs.getInt(1));
            o.setFechaDespacho(rs.getDate(2));
            o.setOperario(rs.getString(3));
            o.setDescEstadoOrden(rs.getString(4));
            ordenes.add(o);
        }
        rs.close();
        ps.close();
        conn.close();
        return ordenes;
    }

    public beOrdenDespacho queryOrdenByID(int idOrdenDespacho) throws Exception{
        String sql = "SELECT A.ID_ORDEN_DESPACHO, A.FECHA_DESPACHO, A.OPERARIO, B.ID_DATO, B.NOMBRE_DATO FROM ORDEN_DESPACHO A LEFT JOIN DATOS_COMBO B ON (A.ESTADOORDEN = B.ID_DATO) WHERE ID_ORDEN_DESPACHO = ?";
        Connection conn = daoHelper.dameConexion();
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1, idOrdenDespacho);
        ResultSet rs = ps.executeQuery();
        beOrdenDespacho od = null;
        if (rs.next()){
            od = new beOrdenDespacho();
            od.setIdOrdenDespacho(rs.getInt(1));
            od.setFechaDespacho(rs.getDate(2));
            od.setOperario(rs.getString(3));
            od.setEstadoOrden(rs.getInt(4));
            od.setDescEstadoOrden(rs.getString(5));
        }
        rs.close();
        ps.close();
        od.setPedidos((new daoPedido()).queryPedidosOrdenByID(idOrdenDespacho,conn));
        conn.close();
        return od;
    }

    public int modificarOrdenDespacho(beOrdenDespacho ordenDespacho, ArrayList<bePedido> pedidosNuevosElegidos) throws Exception{
        String sql = "UPDATE ORDEN_DESPACHO SET FECHA_DESPACHO = ?, OPERARIO = ? WHERE ID_ORDEN_DESPACHO = ?";
        Connection conn = daoHelper.dameConexion();
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setDate(1, ordenDespacho.getFechaDespacho());
        ps.setString(2, ordenDespacho.getOperario());
        ps.setInt(3, ordenDespacho.getIdOrdenDespacho());
        ps.executeUpdate();
        ps.close();
        daoPedido dp = new daoPedido();
        dp.actualizarOrdenPedidoNulo(ordenDespacho.getIdOrdenDespacho(),conn);
        for(int i=0; i<ordenDespacho.getPedidos().size(); i++){
            dp.actualizarEstadoPedido(ordenDespacho.getPedidos().get(i).getIdPedido(), bePedido.P_EN_PROCESO, conn);
        }
        for(int i=0; i<pedidosNuevosElegidos.size(); i++){
            dp.asignarOrdenDespacho(ordenDespacho.getIdOrdenDespacho(), pedidosNuevosElegidos.get(i).getIdPedido(), conn);
            dp.actualizarEstadoPedido(pedidosNuevosElegidos.get(i).getIdPedido(),bePedido.P_POR_DESPACHAR,conn);
        }
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int eliminarOrdenDespacho(int idOrdenDespacho) throws Exception{
        ArrayList<bePedido> pedidos = (new daoPedido()).queryPedidosOrdenByID(idOrdenDespacho, null);
        for(int i=0; i<pedidos.size();i++)
            (new daoPedido()).actualizarEstadoPedido(pedidos.get(i).getIdPedido(), bePedido.P_EN_PROCESO, null);
        (new daoPedido()).actualizarOrdenPedidoNulo(idOrdenDespacho, null);
        (new daoUbicacion()).quitarEstadoReservado(idOrdenDespacho);
        this.actualizarEstadoOrden(idOrdenDespacho, beOrdenDespacho.O_CANCELADA);
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int actualizarEstadoOrden(int idOrdenDespacho, int estadoOrden) throws Exception{
        int estadoOrdenEnBD = this.getEstadoOrdenEnBD(estadoOrden, null);
        String sql = "UPDATE ORDEN_DESPACHO SET ESTADOORDEN = ? WHERE ID_ORDEN_DESPACHO = ?";
        Connection conn = daoHelper.dameConexion();
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1,estadoOrdenEnBD);
        ps.setInt(2, idOrdenDespacho);
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int obtenerNumeroDespachos(int idProducto, int meses) throws Exception{
        int dias = 30*meses;
        String sql = "";
        sql += "SELECT SUM(C.CANTIDAD_PRODUCTO) ";
        sql += "FROM ORDEN_DESPACHO A, PEDIDO B, DETALLE_PEDIDO C, DATOS_COMBO D ";
        sql += "WHERE A.ID_ORDEN_DESPACHO = B.ID_ORDEN_DESPACHO AND ";
        sql += "B.ID_PEDIDO = C.ID_PEDIDO AND ";
        sql += "A.ESTADOORDEN = D.ID_DATO AND ";
        sql += "D.NOMBRE_COMBO = 'DESPAC' AND ";
        sql += "D.NOMBRE_DATO = 'Despachado' AND ";
        sql += "A.FECHA_DESPACHO > (CURRENT_DATE-(INTEGER '"+dias+"')) AND ";
	sql += "C.ID_PRODUCTO = ? ";
        System.out.println(sql);
        Connection conn = daoHelper.dameConexion();
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setInt(1, idProducto);
        ResultSet rs = ps.executeQuery();
        int suma = -1;
        if (rs.next())
            suma = rs.getInt(1);
        rs.close();
        ps.close();
        conn.close();
        return suma;
    }

    public ArrayList<beOrdenDespacho> obtenerOrdenesPorDespachar() throws Exception{
        ArrayList<beOrdenDespacho> ordenes = new ArrayList<beOrdenDespacho>();
        beOrdenDespacho ord = null;
        String sql = "";
        sql += "SELECT A.* ";
        sql += "FROM ORDEN_DESPACHO A, DATOS_COMBO B ";
        sql += "WHERE A.ESTADOORDEN = B.ID_DATO AND ";
        sql += "NOMBRE_DATO = 'Reservado' AND ";
        sql += "NOMBRE_COMBO = 'DESPAC'";
        System.out.println(sql);
        Connection conn = daoHelper.dameConexion();
        PreparedStatement ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        while (rs.next()){
            ord = new beOrdenDespacho();
            ord.setIdOrdenDespacho(rs.getInt(1));
            ord.setFechaDespacho(rs.getDate(2));
            ord.setEstadoOrden(rs.getInt(4));
            ord.setOperario(rs.getString(5));
            ordenes.add(ord);
        }
        rs.close();
        ps.close();
        conn.close();
        return ordenes;
    }

    public int colocarOrdenDespachoYPedidosDespachado(int idOrdenDespacho) throws Exception{
        beOrdenDespacho od = this.queryOrdenByID(idOrdenDespacho);
        String sql1 = "UPDATE ORDEN_DESPACHO SET ESTADOORDEN = 21 WHERE ID_ORDEN_DESPACHO = ?";
        Connection conn = daoHelper.dameConexion();
        PreparedStatement ps1 = conn.prepareStatement(sql1);
        ps1.setInt(1, idOrdenDespacho);
        ps1.executeUpdate();
        ps1.close();
        String sql2 = "UPDATE PEDIDO SET ESTADOPEDIDO = 11 WHERE ID_PEDIDO = ?";
        PreparedStatement ps2 = conn.prepareStatement(sql2);
        for(int i=0; i<od.getPedidos().size();i++){
            ps2.setInt(1, od.getPedidos().get(i).getIdPedido());
            ps2.executeUpdate();
        }
        ps2.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int quitarUbicacion(int idUbicacion,int idPallet, int idOrden) throws SQLException{

        Connection conn = daoHelper.dameConexion();

        String sql1 = "SELECT ID_ORDEN_DESPACHO FROM UBICACION_X_PALLET WHERE ID_UBICACION = ? AND ID_PALLET = ?";
        PreparedStatement ps1 = conn.prepareStatement(sql1);
        ps1.setInt(1, idUbicacion);
        ps1.setInt(2, idPallet);
        ResultSet rs = ps1.executeQuery();
        rs.next();
        idOrden = rs.getInt(1);
        String sql = "UPDATE UBICACION_X_PALLET SET ID_ORDEN_DESPACHO = NULL, ESTADOUBICACION = ?,ORDEN =NULL WHERE ID_UBICACION = ? AND ID_PALLET = ?";
        PreparedStatement ps = conn.prepareStatement(sql);
        int orden = 0;
        //ps.setInt(1,orden);
        ps.setInt(1, 14);
        ps.setInt(2, idUbicacion);
        ps.setInt(3, idPallet);
        ps.executeUpdate();
        ps.close();
        conn.close();
        ps1.close();
        rs.close();
        return idOrden;


    }

    public int agregarOrden(int idUbicacion,int idOrden) throws SQLException{
        String sql = "UPDATE UBICACION_X_PALLET SET ID_ORDEN_DESPACHO = ? WHERE ID_UBICACION = ?";
        Connection conn = daoHelper.dameConexion();
        PreparedStatement ps = conn.prepareStatement(sql);
        int orden = -1;
        ps.setInt(1,idOrden);
        ps.setInt(2, idUbicacion);
        //ps.setInt(3, idPallet);
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;

    }
}